/**
 * File: Igral.h
 *
 * Integrantes:
 * @author Jormar Arellano		(05-37840)	<jormar.arellano@gmail.com>
 * @author Sabrina Fernández	(05-38163)	<sabrinamfm@gmail.com>
 */

#ifndef IGRAL_H
#define	IGRAL_H

#include "graph.h"

#ifdef	__cplusplus
extern "C" {
#endif

/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Parametros del algoritmo
 * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/** 
 * Número de iteraciones para esperar sin mejorar solucion.
 */
int igral_iter;

/**
 * Iteraciones a esperar para pertubar la solucion si esta no ha mejorado.
 */
int igral_iter_perturb;

/** 
 * Probabilidad de volver facetible una solucion infactible usando un metodo greedy para 
 * la recoloracion de vertices en conflicto.
 */
int igral_k1;

/** 
 * Probabilidad para detener la generacion de soluciones infactibles cada vez que no se 
 * mejore una solucion.
 */
int igral_k2;

/** 
 * Imprime informacion verbose.
 * */
int igral_verbose;

/**
 * Inicializa las constantes con valores por defecto.
 */
void igral_defaults();

/**
 * Algoritmo greedy que colorea los nodos con el menor color posible, sin que genere conflictos.
 * @param	graph	Grafo al que se le aplicara algoritmo lowest.
 * @param	l		Arreglo de vertices que denota el orden sobre el cual se aplicara el algorimo.
 * @return	Un grafo resultado de aplicar el algoritmo lowest.
 */
Graph *igral_lowest(Graph *graph, ArrayList *l);

/**
 * Algoritmo greedy que colorea los nodos con el mayor color posible, sin que genere conflictos.
 * @param	graph	Grafo al que se le aplicara algoritmo highest.
 * @param	l		Arreglo de vertices que denota el orden sobre el cual se aplicara el algorimo.
 * @return	Un grafo resultado de aplicar el algoritmo highest.
 */
Graph *igral_highest(Graph *graph, ArrayList *l);

/**
 * Elimina los colores que ya no se estan usando.
 * @param	graph	Grafo que se compactara.
 */
void compact_solution(Graph *graph);


/**
 * Realiza una pequeña perturbacion al grafo, segun ael algoritmo Igral
 * @param   graph   El grafo
 */
void igral_smallPerturbation(Graph *graph);

/**
 * Aplica IGrAl (Iterative Greedy Algorithm).
 */
Graph *igral(Graph *graph);

#ifdef	__cplusplus
}
#endif

#endif

